import dotenv from "dotenv";
import express, { NextFunction, Request, Response, Router } from "express";
import "./Db/redis";
import "./Db/db";
import { fileRouter } from "./apis/files";
import { userRouter } from "./apis/user";
import session from "express-session";
import { generateRandomString } from "./utils";
import { client } from "./Db/redis";
import { RedisStore } from "connect-redis"; // 使用 connect-redis 作为中间件
import cookieParser from "cookie-parser";
dotenv.config();

const app = express();
app.use(express.urlencoded({ extended: true })); // 处理表单数据
app.use(express.json()); // 仅用于 JSON
app.use(cookieParser());
app.use(express.json());
app.get("/", (req: Request, res: Response) => {
  //返回public下的homn.html
  res.sendFile(__dirname + "/home.html");
});

app.all("*", (req: Request, res: Response, next: NextFunction) => {
  let origin = req.headers.origin;
  //设置允许任何域访问
  res.header("Access-Control-Allow-Origin", origin ? origin : "*"); //取访问源的站点
  //设置  允许任何 数据类型
  res.header(
    "Access-Control-Allow-Headers",
    "Content-Type, Content-Length, Authorization, Accept, X-Requested-With"
  );
  //设置 允许 使用的HTTP方法
  res.header("Access-Control-Allow-Methods", "PUT, POST, GET, DELETE, OPTIONS");
  // 兼容前端withCredentials=true的设置
  res.header("Access-Control-Allow-Credentials", "true");

  //过滤预请求
  if (req.method === "OPTIONS") {
    res.sendStatus(200); //如果是预请求 就不再进行后面的中间件匹配执行了   直接发送回数据
  } else {
    next(); //  进入下一个中间件
  }
});

// 使用 RedisStore 作为 session 存储
// app.use(
//   session({
//     store: new RedisStore({
//       client: client, // 使用 redis 客户端
//       prefix: "session:", // 可选：设置 session 的前缀
//     }),
//     secret: "keyboard cat",
//     name: "StoreIt",
//     resave: false, // 确保每次请求时会话都会被保存
//     saveUninitialized: true, // 只有在会话被修改时才会保存
//   })
// );

// 根据前缀分发请求
app.use("/user", userRouter);
app.use("/file", fileRouter);
const PORT = process.env.SERVERPORT || 7000;
app.listen(PORT, () => {
  console.log(`服务器运行在 http://localhost:${PORT}`);
});
